iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0
Modern Web

Ruby on Rails面試題挑戰系列 第 19

Ruby on Rails面試題挑戰 Day19 - delete與destroy差異在哪?

  • 分享至 

  • xImage
  •  

What is the difference between delete and destroy?
delete與destroy差異在哪?


之前在談到Active Record時,有特別說明,對於依照Active Record設計模式的Model,也就是Rails MVC中的Model有內建一些CRUD的方法來讓我們操作其物件,而物件會對應到資料表的資料。

而CRUD中的D也就是刪除方法有兩種,一種是delete,另一種是destroy,我們就來看看兩者的差異為何?

Delete方法

delete(id_or_array)
需要傳入參數id或陣列

會直接使用SQL的DELETE語法刪除資料(以primary key對應到id參數的那一筆),過程中並沒有牽扯到Active Record物件的過程,所以物件的callback都不會被執行,包括與其他model的:dependent關係。

雖然是比destroy方法來的更快,但有可能因此跳過了某些可能寫在程式中必要的callback或是關聯性,所以使用上要特別小心。

# 刪除一行資料
Todo.delete(1)

# 刪除多行資料
Todo.delete([2,3,4])

Destroy方法

destroy(id)

在物件被刪除前,會先需要物件對應的id,物件會先被實體化後,然後呼叫destroy方法,所以刪除過程會執行所有所需要的callback。

這個方法是比delete效率低了點,但會執行所有的callback及需要的動作。

會需要先藉由id找到那個物件(或多個物件),之後實體化後在呼叫destroy。

# 刪除一個物件
Todo.destroy(1)

# 刪除多個物件
todos = [1,2,3]
Todo.destroy(todos)

destroy相關最常見的callback就是與其他model的關聯性。舉下面例子為例,當Article這個model的某一個實體article刪除時,屬於這文章的comments也跟著被刪除。

class Article << ApplicationController
  has_many :comments, dependent: :destroy
end

你可以這樣回答:

delete與destroy的差別在於delete方法不會執行callback方法,雖然效能比較好,但使用上要小心會不會跳過某些callback或關聯性的資料沒有刪除到。

參考資料

1.Rubyguide-ActiveRecord Callbacks

2.53 Ruby on Rails Interview Questions and Answers

3.Active Record Relation


上一篇
Ruby on Rails面試題挑戰 Day18 - before_save 與 after_save 使用時機有何不同?
下一篇
Ruby on Rails面試題挑戰 Day20 - ActiveRecord中的find、find_by和where方法的差異在哪?
系列文
Ruby on Rails面試題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言